﻿using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;

namespace Financial_Assistant
{
    /// <summary>
    /// Логика взаимодействия для DebtCreditCard.xaml
    /// </summary>
    public partial class DebtCreditCard : Window
    {
        private string _connectionString =
                @"Data Source = CHRISTINABEIM\SQLEXPRESS; Initial Catalog=Financial_Assistant; Trusted_Connection=True;"; //( ip-сервера, имя БД, разрешение соединения)

        private string UserID = String.Empty; // нужен для проверки наличия такищ счетов для данного пользователя
        private string OperationID = String.Empty; //ID записи
        private bool type = false; // определяет долг или кредит
        private bool ActionType = true; // true - добавление, false - изменение

        public DebtCreditCard(MyBoolAction _type, string userID, string actionID, string date, string personName, string countName, string summ,
            string percent, string period, string recoverySum, bool state, string definition, bool _actionType)
        {
            InitializeComponent();

            UserID = userID;
            ActionType = _actionType;
            OperationID = actionID;

            DataBox.Text = date;
            SumBox.Text = summ;
            
            ProcentStavkaBox.Text = percent;
            PeriodBox.Text = period;
            recoverySumBox.Text = recoverySum;
            DefinitionBox.Text = definition;

            //если type=true то Долг, должники иначе кредит
            if (_type == MyBoolAction.Creditor)
            {
                this.Title = "Карточка кредитов"; // я взяла в долг
                PersonLabel.Content = "Имя кредитора";
                type = false;
            }
            else if (_type == MyBoolAction.Debtor)
            {
                this.Title = "Карточка долгов"; //я дала в долг
                PersonLabel.Content = "Имя должника";
                type = true;
            }

            //при инициализации загрузить данные в комбобокс
            LoadCombobox();
            //поставить значения для обоих комбобоксов, равное пришедшему в конструктор
            CountComboBox.SelectedItem = countName;
            DebtorCreditComboBox.SelectedItem = personName;
            StatusComboBox.SelectedItem = state;
        }

        private void LoadCombobox()
        {
            //Очищаем комбобокс счетов
            CountComboBox.Items.Clear();

            SqlConnection connection = new SqlConnection(_connectionString);
            connection.Open();

            StringBuilder query = new StringBuilder();
            query.Append("SELECT Наименование FROM Счета where [ID пользователя] = '");
            query.Append(UserID + "'");

            SqlCommand command = new SqlCommand(query.ToString(), connection);
            SqlDataReader reader = command.ExecuteReader();
            while (reader.Read())
            {
                for (int j = 0; j < reader.FieldCount; j++)
                {
                    //countList.Add(reader[j].ToString());
                    CountComboBox.Items.Add(reader[j].ToString());
                }
            }
            reader.Dispose();
            command.Dispose();


            DebtorCreditComboBox.Items.Clear();
            query.Clear();
            query.Append("SELECT Персоны.Имя FROM Персоны where [ID пользователя] = '" + UserID + "'");
            command = new SqlCommand(query.ToString(), connection);
            reader = command.ExecuteReader();
            while (reader.Read())
            {
                for (int j = 0; j < reader.FieldCount; j++)
                {
                    DebtorCreditComboBox.Items.Add(reader[j].ToString());
                }
            }
            reader.Dispose();
            command.Dispose();
            connection.Dispose(); 
        }

        private void CancelBut_Click(object sender, RoutedEventArgs e)
        {
            this.Close();
        }

        private void OKBut_Click(object sender, RoutedEventArgs e)
        {
            //переменные, для проверок корректности ввода, а затем использования их при добавлении
            string ActionDate = String.Empty;//проверка даты
            double check = 0; // проверка суммы общей
            double recoveryCheck = 0; // проверка суммы возвращенной
            int periodCheck = 0; // проверка ввода периода возврата
            double percentCheck = 0; // проверка процентной ставки

            #region проверяем правильность вводма формата даты
            if (DataBox.Text != String.Empty)
            {
                //создаем массив date
                string[] date = new string[3];

                try //пытаемся преобразовать введенную дату
                {
                    date = DataBox.Text.Split('.');
                    DateTime myDate = new DateTime(Convert.ToInt32(date[2]), Convert.ToInt32(date[1]), Convert.ToInt32(date[0])); // формат гггг/мм/дд
                    //преобразуем, удалив время в часах и минутах и запишем в переменную:
                    ActionDate = myDate.ToString().Remove(11);
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Дата введена неверно"); return;
                }
            }
            else
            {
                MessageBox.Show("Введите дату"); return;
            }
            #endregion

            #region проверим правильность ввода суммы
            if (SumBox.Text != String.Empty)
            {
                try //пытаемся преобразовать введенную сумму первый раз по разделителю запятой
                {
                    //если строка имеет формат str = "45,59"
                    check = Convert.ToDouble(SumBox.Text, CultureInfo.GetCultureInfo("ru-RU"));
                    
                    if (check <= 0)
                    {
                        MessageBox.Show("Сумма введена неверно"); return;
                    }
                }
                catch //поймали ошибку, значит пытаемся преобразовать по разделителю - точке
                {
                    try
                    {
                        //если строка имеет формат str = "45.59"
                        check = Convert.ToDouble(SumBox.Text, CultureInfo.GetCultureInfo("en-US"));

                        if (check <= 0)
                        {
                            MessageBox.Show("Сумма введена неверно"); return;
                        }
                    }
                    catch
                    {
                        MessageBox.Show("Сумма введена неверно"); return;
                    }
                }
            }
            else
            {
                MessageBox.Show("Введите сумму");
                return;
            }
            #endregion

            #region проверим правильность ввода суммы, которая уже возвращена
            //проверить правильность ввода суммы
            if (recoverySumBox.Text != String.Empty)
            {
                try //пытаемся преобразовать введенную сумму
                {
                    recoveryCheck = Convert.ToDouble(recoverySumBox.Text, CultureInfo.GetCultureInfo("ru-RU"));
                    if (recoveryCheck < 0)
                    {
                        MessageBox.Show("Сумма введена неверно"); return;
                    }
                }
                catch
                {
                    try
                    {
                        //если строка имеет формат str = "45.59"
                        recoveryCheck = Convert.ToDouble(recoverySumBox.Text, CultureInfo.GetCultureInfo("en-US"));

                        if (recoveryCheck < 0)
                        {
                            MessageBox.Show("Сумма введена неверно"); return;
                        }
                    }
                    catch
                    {
                        MessageBox.Show("Возвращенная сумма введена неверно"); return;
                    }
                }
            }
            else
            {
                recoveryCheck = 0;
            }
            #endregion

            #region проверим правильность ввода периода возврата
            //проверить правильность ввода суммы
            if (PeriodBox.Text != String.Empty)
            {
                try //пытаемся преобразовать введенную сумму
                {
                    periodCheck = Convert.ToInt32(PeriodBox.Text);
                    if (periodCheck <= 0)
                    {
                        MessageBox.Show("Период возврата введен неверно"); return;
                    }
                }
                catch
                {
                    MessageBox.Show("Период возврата введен неверно"); return;
                }
            }
            else
            {
                MessageBox.Show("Введите период возврата"); return;
            }
            #endregion

            #region проверим правильность ввода процентной ставки
            if (ProcentStavkaBox.Text != String.Empty)
            {
                try //пытаемся преобразовать введенную сумму
                {
                    percentCheck = Convert.ToDouble(ProcentStavkaBox.Text);
                    if (percentCheck < 0)
                    {
                        MessageBox.Show("Процентная ставка указана неверно"); return;
                    }
                }
                catch
                {
                    MessageBox.Show("Процентная ставка указана неверно"); return;
                }
            }
            else
            {
                MessageBox.Show("Введите процентную ставку"); return;
            }
            #endregion

            if (CountComboBox.SelectedItem == null)
            {
                MessageBox.Show("Выберите счет");
                return; // выходим из метода
            }

            if (DebtorCreditComboBox.SelectedItem == null)
            {
                if (type) MessageBox.Show("Выберите кредитора");
                else MessageBox.Show("Выберите должника");
                return; // выходим из метода
            }
            else
            {
                try
                {
                    SqlConnection connection = new SqlConnection(_connectionString);
                    connection.Open(); // открыть считывание
                    StringBuilder query = new StringBuilder();

                    #region Получение ID счета
                    //сначала выберем ID счета, на который добавляем расход
                    query.Append("SELECT [ID счета] FROM Счета where [ID пользователя] = '");
                    query.Append(UserID + "' and Наименование = '");
                    query.Append(CountComboBox.SelectedItem.ToString() + "'");

                    SqlCommand command = new SqlCommand(query.ToString(), connection);
                    query.Clear();
                    SqlDataReader reader = command.ExecuteReader();

                    //переменная, хранящая ID счета
                    string temporaryCountID = String.Empty;
                    while (reader.Read())
                    {
                        temporaryCountID = reader[0].ToString();
                    }
                    reader.Dispose();
                    command.Dispose();
                    #endregion

                    #region Получение ID персоны в temporaryPersonID
                    //сначала выберем ID счета, на который добавляем расход
                    query.Append("SELECT Персоны.[ID персоны] FROM Персоны where [ID пользователя] = '" + UserID + "' and  ");
                    query.Append("Имя = '" + DebtorCreditComboBox.SelectedItem.ToString() + "'");

                    command = new SqlCommand(query.ToString(), connection);
                    query.Clear();
                    reader = command.ExecuteReader();

                    //переменная, хранящая ID счета
                    string temporaryPersonID = String.Empty;
                    while (reader.Read())
                    {
                        temporaryPersonID = reader[0].ToString();
                    }
                    reader.Dispose();
                    command.Dispose();
                    #endregion

                    if (ActionType) //добавляем запись
                    {
                        //добавим запись
                        query.Append("EXEC [insert_CreditOrDebt] @PersonId = '" + temporaryPersonID + "', ");
                        query.Append("@Summa = '" + check.ToString(CultureInfo.GetCultureInfo("en-US")) + "', @RecoverySumm = '" + recoveryCheck.ToString(CultureInfo.GetCultureInfo("en-US")) + "',");
                        query.Append("@Type = '" + type + "', @Date = '" + ActionDate + "',");
                        query.Append("@Period = " + periodCheck + ", @PerCent = " + percentCheck + ",");
                        //статус определяем по выбранному индексу в Comboboxe статуса
                        if (StatusComboBox.SelectedIndex == 0) query.Append("@State = 'true',");
                        else query.Append("@State = 'false',");
                        query.Append("@CountID = '" + temporaryCountID + "',");
                        query.Append("@Definition = '");
                        query.Append(DefinitionBox.Text + "'");

                        command = new SqlCommand(query.ToString(), connection);
                        query.Clear();
                        reader = command.ExecuteReader();
                        reader.Read();
                        reader.Dispose();
                        command.Dispose();
                        connection.Dispose();
                        this.Close();
                    }
                    else if (ActionType == false) // изменяем характеристики записи
                    {
                        query.Clear();
                        query.Append("UPDATE [Кредиты и долги] SET [ID персоны] = '" + temporaryPersonID + "', Сумма = '");
                        query.Append(check.ToString(CultureInfo.GetCultureInfo("en-US")));
                        query.Append("', [Начальная дата] = '" + ActionDate + "',");
                        query.Append("[Период кредитования] = ");
                        query.Append(periodCheck + ",");
                        query.Append("[Процентная ставка] = ");
                        query.Append(percentCheck + ",");
                        query.Append("Статус = ");

                        if (StatusComboBox.SelectedIndex == 0) query.Append("'True',"); // true значит возвращен
                        else query.Append("'False',");

                        query.Append("[ID счета] ='" + temporaryCountID + "', Примечание = '");
                        query.Append(DefinitionBox.Text + "', Возвращено = '");
                        query.Append(recoveryCheck.ToString(CultureInfo.GetCultureInfo("en-US")) + "' FROM [Кредиты и долги] where [ID операции] = '" + OperationID + "'");

                        command = new SqlCommand(query.ToString(), connection);
                        reader = command.ExecuteReader();
                        reader.Read();
                        reader.Close();
                        command.Dispose();
                        connection.Dispose();
                        this.Close();
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(this, "Ошибка чтения из базы данных" + Environment.NewLine + ex.Message); return;
                }
            }
        }

        private void AddCount_MouseDown(object sender, MouseButtonEventArgs e)
        {
            CountCard countWin = new CountCard(UserID, String.Empty, String.Empty, String.Empty, true);
            //true - добавление счета
            countWin.ShowDialog();
        }

        private void CalcImage_MouseDown(object sender, MouseButtonEventArgs e)
        {
            //но идет привязка к операционной системе!! просто писать свой калькулятор не хочу
            System.Diagnostics.Process externalProg = new System.Diagnostics.Process();
            externalProg.StartInfo.FileName = "calc.exe";
            externalProg.Start();
        }

        private void AddPerson_MouseDown(object sender, MouseButtonEventArgs e)
        {
            AddPersonWindow myWin = new AddPersonWindow(UserID, String.Empty, String.Empty, true);
            myWin.ShowDialog();
            //обновить данные в комбобоксе
            LoadCombobox();
        }
    }
}
